<?php
/***************************************************************
*  Copyright notice
*  (c) 2009, jianyuzhu@gmail.com
*  All rights reserved
*  This script is part of the PPEMI project.
***************************************************************/

////////////////////////////////////////////////////////////////////////////////////////////////
//
// Function    : func_validate_email
//
// Arguments   : email   email address to be checked
//
// Return      : true  - valid email address
//               false - invalid email address
//
// Description : function for validating email address that conforms to RFC 822 specs
//
//               This function is converted from a JavaScript written by
//               Sandeep V. Tamhankar (stamhankar@hotmail.com). The original JavaScript
//               is available at http://javascript.internet.com
//
// Sample Valid Addresses:
//
//    first.last@host.com
//    firstlast@host.to
//    "first last"@host.com
//    "first@last"@host.com
//    first-last@host.com
//    first.last@[123.123.123.123]
//
// Invalid Addresses:
//
//    first last@host.com
//
//
////////////////////////////////////////////////////////////////////////////////////////////////
function func_validate_email($email) {
	$valid_address = true;
	
	$mail_pat = '^(.+)@(.+)$';
	$valid_chars = "[^] \(\)<>@,;:\.\\\"\[]";
	$atom = "$valid_chars+";
	$quoted_user='(\"[^\"]*\")';
	$word = "($atom|$quoted_user)";
	$user_pat = "^$word(\.$word)*$";
	$ip_domain_pat='^\[([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\]$';
	$domain_pat = "^$atom(\.$atom)*$";

	if( eregi($mail_pat, $email, $components)) {
		$user = $components[1];
		$domain = $components[2];
		// validate user
		if( eregi($user_pat, $user)) {
			// validate domain
			if( eregi($ip_domain_pat, $domain, $ip_components)) {
				// this is an IP address
				for ($i=1;$i<=4;$i++) {
					if( $ip_components[$i] > 255) {
						$valid_address = false;
						break;
					}
				}
			} else {
				// Domain is a name, not an IP
				if( eregi($domain_pat, $domain)) {
					/* domain name seems valid, but now make sure that it ends in a valid TLD or ccTLD
					 and that there's a hostname preceding the domain or country. */
					$domain_components = explode(".", $domain);
					// Make sure there's a host name preceding the domain.
					if( sizeof($domain_components) < 2) {
						$valid_address = false;
					} else {
						$top_level_domain = strtolower($domain_components[sizeof($domain_components)-1]);
						// Allow all 2-letter TLDs (ccTLDs)
						if( eregi('^[a-z][a-z]$', $top_level_domain) != 1) {
							$tld_pattern = '';
							// Get authorized TLDs from text file
							$tlds = file(DIR_WS_INCLUDES . 'tld.txt');
							while(list(,$line) = each($tlds)) {
								// Get rid of comments
								$words = explode('#', $line);
								$tld = trim($words[0]);
								// TLDs should be 3 letters or more
								if( eregi('^[a-z]{3,}$', $tld) == 1) {
									$tld_pattern .= '^' . $tld . '$|';
								}
							}
							// Remove last '|'
							$tld_pattern = substr($tld_pattern, 0, -1);
							if( eregi("$tld_pattern", $top_level_domain) == 0) {
								$valid_address = false;
							}
						}
					}
				} else {
					$valid_address = false;
				}
			}
		} else {
			$valid_address = false;
		}
	} else {
		$valid_address = false;
	}
	
	if( $valid_address && ENTRY_EMAIL_ADDRESS_CHECK == 'true') {
		if( !checkdnsrr($domain, "MX") && !checkdnsrr($domain, "A")) {
			$valid_address = false;
		}
	}
	
	return $valid_address;
}
//
?>